package app

import (
	"github.com/google/uuid"
	"path/filepath"
	"zin/framework"
	_const "zin/framework/const"
	"zin/framework/util"
)

type ProviderServiceApp struct {
	container  framework.Container // 服务容器
	baseFolder string              // 基础路径
	appId      string              // 表示当前这个app的唯一id, 可以用于分布式锁等
}

// Version 实现版本
func (p *ProviderServiceApp) Version() string {
	return "0.0.3"
}

// BaseFolder 表示基础目录，可以代表开发场景的目录，也可以代表运行时候的目录
func (p *ProviderServiceApp) BaseFolder() string {
	if p.baseFolder != "" {
		return p.baseFolder
	}

	// 如果参数也没有，使用默认的当前路径
	return util.GetExecDirectory()
}

// ConfigFolder  表示配置文件地址
func (p *ProviderServiceApp) ConfigFolder() string {
	dir := filepath.Join(p.BaseFolder(), _const.ConfigFolder)
	err := util.CheckDirExistsAndMk(dir)
	if err != nil {
		return err.Error()
	}
	return dir
}

// LogFolder 表示日志存放地址
func (p *ProviderServiceApp) LogFolder() string {
	dir := filepath.Join(p.StorageFolder(), _const.LogFolder)
	err := util.CheckDirExistsAndMk(dir)
	if err != nil {
		return err.Error()
	}
	return dir
}

func (p *ProviderServiceApp) HttpFolder() string {
	return filepath.Join(p.AppFolder(), _const.HttpFolder)
}

func (p *ProviderServiceApp) AppFolder() string {
	return filepath.Join(p.BaseFolder(), _const.AppFolder)
}

func (p *ProviderServiceApp) ConsoleFolder() string {
	return filepath.Join(p.AppFolder(), _const.ConsoleFolder)
}

func (p *ProviderServiceApp) StorageFolder() string {
	return filepath.Join(p.BaseFolder(), _const.StorageFolder)
}

// ProviderFolder 定义业务自己的服务提供者地址
func (p *ProviderServiceApp) ProviderFolder() string {
	return filepath.Join(p.AppFolder(), _const.ProviderFolder)
}

// MiddlewareFolder 定义业务自己定义的中间件
func (p *ProviderServiceApp) MiddlewareFolder() string {
	return filepath.Join(p.HttpFolder(), _const.MiddlewareFolder)
}

// CommandFolder 定义业务定义的命令
func (p *ProviderServiceApp) CommandFolder() string {
	return filepath.Join(p.ConsoleFolder(), _const.CommandFolder)
}

// RuntimeFolder 定义业务的运行中间态信息
func (p *ProviderServiceApp) RuntimeFolder() string {
	dir := filepath.Join(p.StorageFolder(), _const.RuntimeFolder)
	err := util.CheckDirExistsAndMk(dir)
	if err != nil {
		return err.Error()
	}
	return dir
}

// TestFolder 定义测试需要的信息
func (p *ProviderServiceApp) TestFolder() string {
	return filepath.Join(p.BaseFolder(), _const.TestFolder)
}

func NewProviderServiceApp(params map[string]interface{}) (interface{}, error) {
	// 有两个参数，一个是容器，一个是baseFolder
	container := params["container"].(framework.Container)
	baseFolder := params["baseFolder"].(string)

	appId := uuid.New().String()
	return &ProviderServiceApp{baseFolder: baseFolder, container: container, appId: appId}, nil
}

// AppID 表示这个App的唯一ID
func (p *ProviderServiceApp) AppID() string {
	return p.appId
}
